package $3exceptionhandler;

import java.io.IOException;

public class FnTryCatch {

    public static void main(String[] args) {
        // 异常捕获 try ... catch
        // 在Java中，凡是可能抛出异常的语句，都可以用try ... catch捕获。
        // 把可能发生异常的语句放在try { ... }中，然后使用catch捕获对应的Exception及其子类。

        // 多catch语句
        // 可以使用多个catch语句，每个catch分别捕获对应的Exception及其子类。
        // JVM在捕获到异常后，会从上到下匹配catch语句，匹配到某个catch后，执行catch代码块，然后不再继续匹配。
        // 多个catch语句只有一个能被执行。
        // 存在多个catch的时候，catch的顺序非常重要：子类必须写在前面。
        // Java的try ... catch机制还提供了finally语句，finally语句块保证有无错误都会执行。
        // 注意finally有几个特点：
        // 1、finally语句不是必须的，可写可不写；
        // 2、finally总是最后执行。
        // finally是用来保证一些代码必须执行的。某些情况下，可以没有catch，只使用try ... finally结构。

        try {
            process1();
            process2();
            process3();
        } catch (IOException | SecurityException  e) {
            //因为处理IOException和SecurityException的代码是相同的，所以我们可以把它两用|合并到一起
            System.out.println(e);
        } catch (NumberFormatException e) {
            System.out.println(e);
            System.out.println("Bad encoding");
        } finally {
            System.out.println("END");
        }

    }

    private static void process3() throws IOException {
        // TODO Auto-generated method stub
        System.out.println("process3 run");
    }

    private static void process2() throws IOException {
        // TODO Auto-generated method stub
        System.out.println("process2 run");
    }

    private static void process1() throws IOException {
        // TODO Auto-generated method stub
        System.out.println("process1 run");
    }

}
